<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>15_RegExp-正则规则的量词</title>
  <!-- 
  在 JavaScript 中，正则表达式（RegExp）中的量词用于指定一个字符、字符类或子表达式可以出现的次数。量词可以用来控制匹配的长度和次数，从而实现更复杂的匹配规则。
  一、基本量词

   1.  `*` （零次或多次）
  匹配前面的字符或子表达式零次或多次。
  const regex = /a*/; // 匹配零个或多个 'a'
  console.log(regex.test(''));      // true
  console.log(regex.test('aaa'));    // true
  console.log(regex.test('b'));      // true（匹配零次）
   2.  `+` （一次或多次）

  匹配前面的字符或子表达式一次或多次。
  const regex = /a+/; // 匹配一个或多个 'a'
  console.log(regex.test(''));      // false
  console.log(regex.test('aaa'));    // true
  console.log(regex.test('b'));      // false
   3.  `?` （零次或一次）

  匹配前面的字符或子表达式零次或一次。
  const regex = /a?/; // 匹配零个或一个 'a'
  console.log(regex.test(''));      // true
  console.log(regex.test('a'));     // true
  console.log(regex.test('aaa'));    // false
   4.  `{n}` （精确匹配 n 次）

  匹配前面的字符或子表达式恰好 n 次。
  const regex = /a{3}/; // 匹配恰好三个 'a'
  console.log(regex.test('aaa'));    // true
  console.log(regex.test('aa'));      // false
  console.log(regex.test('aaaa'));    // false
   5.  `{n,}` （至少 n 次）

  匹配前面的字符或子表达式至少 n 次。
  const regex = /a{2,}/; // 匹配至少两个 'a'
  console.log(regex.test('aa'));      // true
  console.log(regex.test('aaa'));     // true
  console.log(regex.test('a'));       // false
   6.  `{n,m}` （匹配 n 到 m 次）

  匹配前面的字符或子表达式至少 n 次，但不超过 m 次。
  const regex = /a{2,4}/; // 匹配 2 到 4 个 'a'
  console.log(regex.test('aa'));      // true
  console.log(regex.test('aaa'));     // true
  console.log(regex.test('aaaa'));    // true
  console.log(regex.test('a'));       // false
  console.log(regex.test('aaaaa'));   // false
  二、量词的贪婪与懒惰

  量词默认是贪婪的，即尽可能多地匹配字符。如果要使量词懒惰（即尽可能少地匹配），可以在量词后添加一个问号  `?` 。

   1. 贪婪量词
  const regex = /<.*>/; // 贪婪匹配
  const str = '<div>内容</div>';
  console.log(str.match(regex)); // 输出: ['<div>内容</div>']
   2. 懒惰量词
  const regex = /<.*?>/; // 懒惰匹配
  const str = '<div>内容</div>';
  console.log(str.match(regex)); // 输出: ['<div>']
  三、总结
  - 量词 用于指定字符或子表达式的出现次数。
  - 常用的量词包括  `*` 、 `+` 、 `?` 、 `{n}` 、 `{n,}`  和  `{n,m}` 。
  - 量词可以是贪婪的（默认）或懒惰的（通过在量词后加  `?` ）。
  - 通过理解和使用量词，可以实现更复杂和灵活的字符串匹配。
  -->
</head>
<body>

  <script>
    // 量词：用来设定某个模式出现的次数
    // *  0次或多次
    // +  1次或多次
    // ?  0次或1次
    // {n}  恰好n次
    // {n,}  至少n次
    // {n,m}  至少n次，但是不超过m次

    // 1. *  0次或多次
    // let reg = /a*/;
    // console.log(reg.test('')); // true

    // 使用
    const msg = "sakdlfjalsaaaaajksdflaafd132131231231231jkladfj";
    const reg = /a{2,5}/ig;
    console.log(msg.match(reg)); // aaaa

    // 案例: 字符串的html元素, 匹配出来里面所有的标签
    const htmlElement = "<div><span>量词</span><h2>正则规则的量词</h2></div>"
    const tagReg = /<\/?(\w{2,4})>/ig
    // const tagReg = /<\/?[a-z][a-z0-9]*>/ig
    console.log(htmlElement.match(tagReg)); 
    
    

  </script>
  
</body>
</html>